package notes.java.concurrent;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Sysnchronize 测试
 * 
 * @author wangcs
 *
 */
public class T8_TestSynch {

	// 修饰代码块
	public void test(String name) {
		synchronized (this) {
			for (int i = 0; i < 10; i++) {
				System.out.println("test1:" + name + "," + i);
			}
			System.out.println("------");
		}
	}

	// 修饰方法
	public synchronized void test2(String name) {
		for (int i = 0; i < 10; i++) {
			System.out.println("test2:" + name + "," + i);
		}
		System.out.println("------");
	}

	// 测试一：一个T8_TestSynch时，作用于當前對象synch
	public static void r() {
		// 启动了10个线程，同时执行（结果是顺序的，不会交叉乱序。）
		ExecutorService service = Executors.newCachedThreadPool();
		T8_TestSynch synch = new T8_TestSynch();
		for (int i = 0; i < 10; i++) {
			service.execute(() -> {
				synch.test("线程1");
			});
		}
	}

	// 测试二：两个T8_TestSynch时，分别作用于对象synch和synch2
	public static void r2() {
		// 启动了10个线程，同时执行（结果是顺序的，不会交叉乱序。）
		ExecutorService service = Executors.newCachedThreadPool();
		T8_TestSynch synch = new T8_TestSynch();
		for (int i = 0; i < 10; i++) {
			service.execute(() -> {
				synch.test("线程1");
			});
		}

		// 证明修饰代码块只作用于调用的对象（打印结果是交叉的，但对名称为线程1或线程2它们自己的顺序是正常的）
		T8_TestSynch synch2 = new T8_TestSynch();
		for (int i = 0; i < 10; i++) {
			service.execute(() -> {
				synch2.test("线程2");
			});
		}
	}

	public static void main(String[] args) {
//		r();
		r2();
	}

}
